#ifndef _WX_FILEDLG_H_BASE_
#define _WX_FILEDLG_H_BASE_

#include "wx/defs.h"

#if wxUSE_FILEDLG

#include "wx/dialog.h"
#include "wx/arrstr.h"

enum {
  wxFD_OPEN              = 0x0001,
  wxFD_SAVE              = 0x0002,
  wxFD_OVERWRITE_PROMPT  = 0x0004,
  wxFD_FILE_MUST_EXIST   = 0x0010,
  wxFD_MULTIPLE          = 0x0020,
  wxFD_CHANGE_DIR        = 0x0080,
  wxFD_PREVIEW           = 0x0100
};

enum {
  wxOPEN              = wxFD_OPEN,
  wxSAVE              = wxFD_SAVE,
  wxOVERWRITE_PROMPT  = wxFD_OVERWRITE_PROMPT,
  wxFILE_MUST_EXIST   = wxFD_FILE_MUST_EXIST,
  wxMULTIPLE          = wxFD_MULTIPLE,
  wxCHANGE_DIR        = wxFD_CHANGE_DIR
};

#define wxFD_DEFAULT_STYLE      wxFD_OPEN

extern const wxChar wxFileDialogNameStr[];
extern const wxChar wxFileSelectorPromptStr[];
extern const wxChar wxFileSelectorDefaultWildcardStr[];

//----------------------------------------------------------------------------
// wxFileDialogBase
//----------------------------------------------------------------------------

class wxFileDialogBase: public wxDialog {
  public:
    wxFileDialogBase() { Init(); }

    wxFileDialogBase( wxWindow *parent,
                      const wxString& message = wxFileSelectorPromptStr,
                      const wxString& defaultDir = wxEmptyString,
                      const wxString& defaultFile = wxEmptyString,
                      const wxString& wildCard = wxFileSelectorDefaultWildcardStr,
                      long style = wxFD_DEFAULT_STYLE,
                      const wxPoint& pos = wxDefaultPosition,
                      const wxSize& sz = wxDefaultSize,
                      const wxString& name = wxFileDialogNameStr ) {
      Init();
      Create( parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name );
    }

    bool Create( wxWindow *parent,
                 const wxString& message = wxFileSelectorPromptStr,
                 const wxString& defaultDir = wxEmptyString,
                 const wxString& defaultFile = wxEmptyString,
                 const wxString& wildCard = wxFileSelectorDefaultWildcardStr,
                 long style = wxFD_DEFAULT_STYLE,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& sz = wxDefaultSize,
                 const wxString& name = wxFileDialogNameStr );

    bool HasFdFlag( int flag ) const { return HasFlag( flag ); }

    virtual void SetMessage( const wxString& message ) { m_message = message; }
    virtual void SetPath( const wxString& path ) { m_path = path; }
    virtual void SetDirectory( const wxString& dir ) { m_dir = dir; }
    virtual void SetFilename( const wxString& name ) { m_fileName = name; }
    virtual void SetWildcard( const wxString& wildCard ) { m_wildCard = wildCard; }
    virtual void SetFilterIndex( int filterIndex ) { m_filterIndex = filterIndex; }

    virtual wxString GetMessage() const { return m_message; }
    virtual wxString GetPath() const { return m_path; }
    virtual void GetPaths( wxArrayString& paths ) const { paths.Empty(); paths.Add( m_path ); }
    virtual wxString GetDirectory() const { return m_dir; }
    virtual wxString GetFilename() const { return m_fileName; }
    virtual void GetFilenames( wxArrayString& files ) const { files.Empty(); files.Add( m_fileName ); }
    virtual wxString GetWildcard() const { return m_wildCard; }
    virtual int GetFilterIndex() const { return m_filterIndex; }

    // Utility functions

    wxDEPRECATED( long GetStyle() const );
    wxDEPRECATED( void SetStyle( long style ) );
    static wxString AppendExtension( const wxString &filePath, const wxString &extensionList );

  protected:
    wxString      m_message;
    wxString      m_dir;
    wxString      m_path;       // Full path
    wxString      m_fileName;
    wxString      m_wildCard;
    int           m_filterIndex;

  private:
    void Init();
    DECLARE_DYNAMIC_CLASS( wxFileDialogBase )
    DECLARE_NO_COPY_CLASS( wxFileDialogBase )
};

//----------------------------------------------------------------------------
// wxFileDialog convenience functions
//----------------------------------------------------------------------------

// File selector - backward compatibility
wxString wxFileSelector( const wxChar *message = wxFileSelectorPromptStr,
                const wxChar *default_path = NULL,
                const wxChar *default_filename = NULL,
                const wxChar *default_extension = NULL,
                const wxChar *wildcard = wxFileSelectorDefaultWildcardStr,
                int flags = 0,
                wxWindow *parent = NULL,
                int x = wxDefaultCoord, int y = wxDefaultCoord );

// An extended version of wxFileSelector
wxString wxFileSelectorEx( const wxChar *message = wxFileSelectorPromptStr,
                  const wxChar *default_path = NULL,
                  const wxChar *default_filename = NULL,
                  int *indexDefaultExtension = NULL,
                  const wxChar *wildcard = wxFileSelectorDefaultWildcardStr,
                  int flags = 0,
                  wxWindow *parent = NULL,
                  int x = wxDefaultCoord, int y = wxDefaultCoord );

// Ask for filename to load
wxString wxLoadFileSelector( const wxChar *what,
                    const wxChar *extension,
                    const wxChar *default_name = ( const wxChar * )NULL,
                    wxWindow *parent = ( wxWindow * ) NULL );

// Ask for filename to save
wxString wxSaveFileSelector( const wxChar *what,
                    const wxChar *extension,
                    const wxChar *default_name = ( const wxChar * ) NULL,
                    wxWindow *parent = ( wxWindow * ) NULL );


#include "wx/gtk/filedlg.h"     // GTK+ > 2.4 has native version

#endif // wxUSE_FILEDLG

#endif // _WX_FILEDLG_H_BASE_
